www.gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringlib/ringservlogfile.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // RingSDK类库 ringservice.lib //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //原文件名:ringservlogfile.cpp // //说明:服务器日志文件类的封装实现 // **********************************************************************/ #define MAKE_SELF_LIB #include "ringlib.h" RingServLogFile::RingServLogFile() { m_thread = NULL; m_nMaxFileSize = 0xFFFFFFFF; m_bNewLine = TRUE; m_nCurrDay = 0; m_lpszErr = NULL; m_rf = new ringFile; } RingServLogFile::~RingServLogFile() { delete m_thread; Del(m_lpszErr); delete m_rf; } void RingServLogFile::SetLogFile(LPCTSTR lpszLogfile,int nMaxSize,BOOL bWithDate/*=FALSE*/) { if(m_rf) { m_ctl.Enter(); try { if(lpszLogfile) m_rf->SetFile(lpszLogfile); if(nMaxSize > 0) m_nMaxFileSize = nMaxSize; if(bWithDate) { memset(m_szFilePrefix,0,MAX_PATH); strncpy(m_szFilePrefix,m_rf->Pathname(),MAX_PATH-1); strcat(m_szFilePrefix,"\\"); strcat(m_szFilePrefix,m_rf->Titlename()); m_nCurrDay = 0; if(m_thread == NULL) m_thread = new RingThread; if(m_thread) { //线程函数循环并不死等,wait的作用是看是否超时 m_thread->Wait(); m_thread->Start(this,(THREADFUNC)MonDateProc); } } else m_rf->Create(RF_APPEND); } catch(...) { } m_ctl.Leave(); } } BOOL RingServLogFile::WriteLog(LPCTSTR lpBuf,LPCTSTR lpBufNext) { if(lpBuf) return WriteLog((LPSTR)lpBuf,strlen(lpBuf),(LPSTR)lpBufNext, lpBufNext?strlen(lpBufNext):0,FALSE,FALSE); else return FALSE; } BOOL RingServLogFile::WriteLog(LPVOID lpBuf,int nSize) { if(lpBuf) return WriteLog(lpBuf,nSize,NULL,0,FALSE,FALSE); else return FALSE; } BOOL RingServLogFile::WriteError(DWORD dwErrCode) { BOOL bOK = FALSE; if(m_rf) { m_ctl.Enter(); if(m_lpszErr == NULL) m_lpszErr = (LPSTR)New(1024*sizeof(TCHAR)); if(m_lpszErr) if(GetErrMessage(dwErrCode,m_lpszErr,1024)) { if(m_rf->Size() > m_nMaxFileSize) { m_rf->SeekToBegin(); m_rf->SetEndOfFile(); } bOK = m_rf->Write(m_lpszErr,strlen(m_lpszErr)); wsprintf(m_lpszErr,"[%d]\0",dwErrCode); m_rf->WriteLine(m_lpszErr); m_bNewLine = TRUE; } m_ctl.Leave(); } return bOK; } BOOL RingServLogFile::WriteLog(LPVOID lpBuf,int nSize1,LPVOID lpBufNext,int nSize2, BOOL bSetNewLine,BOOL bAddWrap) { BOOL bOK; m_ctl.Enter(); if(m_rf->Size() > m_nMaxFileSize) { m_rf->SeekToBegin(); m_rf->SetEndOfFile(); } if(m_bNewLine) { wsprintf(m_szDate,"[%d-%02d-%02d %02d:%02d:%02d.%03d]\0",m_rdt.year(),m_rdt.month(), m_rdt.day(),m_rdt.hour(),m_rdt.minute(),m_rdt.second(),m_rdt.ms()); m_rf->Write(m_szDate,strlen(m_szDate)); } bOK = m_rf->Write(lpBuf,nSize1); if(lpBufNext) bOK = m_rf->Write(lpBufNext,nSize2); m_bNewLine = bSetNewLine; if(bAddWrap) m_rf->Write("\r\n",2); m_ctl.Leave(); return bOK; } BOOL RingServLogFile::WriteLogLine(LPCTSTR lpBuf,LPCTSTR lpBufNext) { if(lpBuf) return WriteLog((LPSTR)lpBuf,strlen(lpBuf),(LPSTR)lpBufNext, lpBufNext?strlen(lpBufNext):0,TRUE,TRUE); else return FALSE; } void RingServLogFile::OnDateChange() { m_ctl.Enter(); try { char ext[40]; memset(ext,0,40); wsprintf(ext,m_rf->Extname()); m_rf->SetFile("%s%d%02d%02d.%s\0",m_szFilePrefix,m_rdt.year(),m_rdt.month(),m_rdt.day(),ext); m_rf->Create(RF_APPEND); } catch(...) { } m_ctl.Leave(); } DWORD RingServLogFile::MonDateProc(LONG) { while(m_thread->IsRunning()) { if(m_rdt.day() != m_nCurrDay) { m_nCurrDay = m_rdt.day(); OnDateChange(); } if(m_thread->CanContinue(20000)) break; } return 0xDead; }